﻿#define  _CRT_SECURE_NO_WARNINGS 1
// 逻辑操作符  && || !
//!：逻辑取反运算符（改变单个表达式的真假）。
//&& ：与运算符，就是并且的意思（两侧的表达式都为真，则为真，否则为假）。
//|| ：或运算符，就是或者的意思（两侧⾄少有⼀个表达式为真，则为真，否则为假）。  c语言中 非0表示真  0表示假

#include <stdio.h>
//int main()
//{
//	int flag = 0;
//	scanf("%d", &flag);  // 输入0   如果输入1就不会打印hehe
//	if (!flag)  // 取反  就变成非0了  所以真  打印hehe
//	{
//		printf(" hehe");
//	}
//	return 0;
//}

//int main()
//{
//	int month = 0;
//	scanf("%d", &month);
//	if (month >= 3 && month <= 5)
//	{
//		printf("春天");
//	}
//	return 0;
//}

//int main()
//{
//	int month = 0;
//	scanf("%d", &month);
//	if (month == 12 || month == 1 || month == 2)
//	{
//		printf("冬天");
//	}
//	return 0;
//}

//输⼊⼀个年份year，判断year是否是闰年
//闰年判断的规则：
//1. 能被4整除并且不能被100整除是闰年
//2. 能被400整除是闰年
//int main()
//{
//	int year = 0;
//	scanf("%d", &year);
//	if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
//	{
//		printf("%d是闰年", year);
//	}
//	return 0;
//}

//C语⾔逻辑运算符还有⼀个特点，它总是先对左侧的表达式求值，再对右边的表达式求值，这个顺序是
//保证的。
//如果左边的表达式满⾜逻辑运算符的条件，就不再对右边的表达式求值。这种情况称为“短路”。
//如前⾯的代码 : if (month >= 3 && month <= 5)
//表达式中&& 的左操作数是 month >= 3 ，右操作数是 month <= 5, 当左操作数 month >= 3 的
//结果是0的时候，即使不判断 month <= 5 ，整个表达式的结果也是0（不是春季）。
//所以，对于 && 操作符来说，左边操作数的结果是0的时候，右边操作数就不再执⾏。
//对于 || 操作符是怎么样呢？我们结合前⾯的代码： if (month == 12 || month == 1 || month == 2)
//如果month == 12，则不⽤再判断month是否等于1或者2，整个表达式的结果也是1（是冬季）。
//所以， || 操作符的左操作数的结果不为0时，就⽆需执⾏右操作数。
//像这种仅仅根据左操作数的结果就能知道整个表达式的结果，不再对右操作数进⾏计算的运算称为短
//路求值。

#include <stdio.h>
//int main()
//{
//	int i = 0, a = 0, b = 2, c = 3, d = 4;
//	//i = (a++ && ++b && d++);  // 后置++先使用 后++ 所以a = 0 为假 剩下的就不算了  短路了
//	i = a++||++b||d++;  // || 操作符的左操作数的结果不为0时，就⽆需执⾏右操作数
//	printf(" i = %d\n a = %d\n b = %d\n c = %d\n d = %d\n",i, a, b, c, d);  // &&的时候 i = 0 a = 1 b = 2 c = 3 d = 4
//	// || 的时候 i = 1 a = 1 b = 3 c = 3 d = 4
//	return 0;
//}

//int main()
//{
//	int i = 0, a = 1, b = 2, c = 3, d = 4;
//	//i = (a++ && ++b && d++);  // 后置++先使用 后++  左边为真所以还要继续算 一直为真 所以i = 1
//	i = a++||++b||d++;   // || 操作符的左操作数的结果不为0时，就⽆需执⾏右操作数
//	printf(" i = %d\n a = %d\n b = %d\n c = %d\n d = %d\n", i, a, b, c, d);  // &&的时候 i = 1 a = 2 b = 3 c = 3 d = 5
//	 // ||的时候 i = 1 a = 2 b = 2 c = 3 d = 4
//	return 0;
//}

//除了 if 语句外，C语⾔还提供了 switch 语句来实现分⽀结构。
//switch 语句是⼀种特殊形式的 if...else 结构，⽤于判断条件有多个结果的情况。它把多重
//的 else if 改成更易⽤、可读性更好的形式。

//switch (expression) 
//{
//case value1: statement
//case value2: statement
//default: statement
//}

//上⾯代码中，根据表达式 expression 不同的值，执⾏相应的 case 分⽀。如果找不到对应的值，
//就执⾏ default 分⽀。
//注：
//• switch 后的 expression 必须是整型表达式
//• case 后的值，必须是整形常量表达式  不能是变量
// 不能使用浮点型float double  但是可以使用字符类型char  因为字符类型也是归类到整型家族里面的，因为字符的本质是ASCII码值，这个值是整数
// 注意每一个case语句后面都需要加上break
// default可有可无
//if和switch语句的对比
// 练习：输入一个整数值，计算除三之后的余数

//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	if (n % 3 == 0)
//		printf("余数是0\n");
//	else if (n % 3 == 1)
//		printf("余数是1\n");
//	else
//		printf("余数是2\n");
//	return 0;
//}

//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	switch (n % 3)
//	{
//	case 0:
//		printf("余数是0");
//	case 1:
//		printf("余数是1");
//	case 2:
//		printf("余数是2");
//	}  // 三个都输出了，因为我们没有加break
//	return 0;
//}

//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	switch (n % 3)
//	{
//	case 0:
//		printf("余数是0");
//		break;
//	case 1:
//		printf("余数是1");
//		break;
//	case 2:
//		printf("余数是2");
//		break;
//	}  
//	return 0;
//}

//int main()
//{
//	int day = 0;
//	scanf("%d", &day);
//	switch (day)
//	{
//	case 1:
//		printf("星期一");
//		break;
//	case 2:
//		printf("星期二");
//		break;
//	case 3:
//		printf("星期三");
//		break;
//	case 4:
//		printf("星期四");
//		break;
//	case 5:
//		printf("星期五");
//		break;
//	case 6:
//		printf("星期六");
//		break;
//	case 7:
//		printf("星期天");
//		break;
//	}
//	return 0;
//}

// case 语句不一样要加break 看实际需求
//int main()
//{
//	int day = 0;
//	scanf("%d", &day);
//	switch (day)
//	{
//	case 1:
//	case 2:
//	case 3:
//	case 4:
//	case 5:
//		printf("工作日\n");
//		break;
//	case 6:
//	case 7:
//		printf("休息日\n");
//		break;
//	}
//	return 0;
//}

//switch语句中的default
//在使⽤ switch 语句的时候，我们经常可能遇到⼀种情况，⽐如 switch 后的表达式中的值⽆法匹
//配代码中的 case 语句的时候，这时候要不就不做处理，要不就得在 switch 语句中加⼊
//default ⼦句。
//int main()
//{
//	int day = 0;
//	scanf("%d", &day);
//	switch (day)
//	{
//	case 1:
//	case 2:
//	case 3:
//	case 4:
//	case 5:
//		printf("工作日\n");
//		break;
//	case 6:
//	case 7:
//		printf("休息日\n");
//		break;
//	default:
//		printf("输入错误 ,输入的值应该到1~7的范围内");
//		break;
//	}
//	return 0;
//}
//case 和 default 无顺序要求，谁在前先都可以


//C语⾔提供了3种循环语句， while 就是其中⼀种，接下来就介绍⼀下 while 语句。
//while 语句的语法结构和 if 语句⾮常相似。
//if (表达式)
//	语句;
//while (表达式)
//	语句;

//int main()
//{
//	int n = 10;
//	while (n > 0)
//		printf("hehe\n");  // 死循环输出，因为10一直大于0
//	return 0;
//}

// 打印1-10
//int main()
//{
//	int i = 1;
//	while (i <= 10)
//	{
//		printf("%d ", i);
//		i++;  // i + 1
//	}
//	return 0;
//}

//输⼊⼀个正的整数，逆序打印这个整数的每⼀位
//例如：
//输⼊：1234，输出：4 3 2 1
//输⼊：521，输出：1 2 5

//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	while (n)  // n = 0就不在执行循环  
//	{
//		int a = n % 10;
//		printf("%d ", a);
//		n /= 10;  // 去掉已经打印的最后一位  当n已经只剩一位了，n%10可以得到n本身这位，但是n/10就等于0了，下一次循环不在执行
//		// n /=10是n/10之后的值再赋给n
//	}
//	return 0;
//}

